/*
 * Copyright (C) 2005-2011 MaNGOS <http://www.getmangos.com/>
 *
 * Copyright (C) 2008-2011 Trinity <http://www.trinitycore.org/>
 *
 * Copyright (C) 2010-2011 ProjectSkyfire <http://www.projectskyfire.org/>
 * 
 * Copyright (C) 2011 ArkCORE <http://www.arkania.net/>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#include "gamePCH.h"
#include "Battleground.h"
#include "BattlegroundBE.h"
#include "Language.h"
#include "Object.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "WorldPacket.h"

BattlegroundBE::BattlegroundBE() {
	m_BgObjects.resize(BG_BE_OBJECT_MAX);

	m_StartDelayTimes[BG_STARTING_EVENT_FIRST] = BG_START_DELAY_1M;
	m_StartDelayTimes[BG_STARTING_EVENT_SECOND] = BG_START_DELAY_30S;
	m_StartDelayTimes[BG_STARTING_EVENT_THIRD] = BG_START_DELAY_15S;
	m_StartDelayTimes[BG_STARTING_EVENT_FOURTH] = BG_START_DELAY_NONE;
	//we must set messageIds
	m_StartMessageIds[BG_STARTING_EVENT_FIRST] = LANG_ARENA_ONE_MINUTE;
	m_StartMessageIds[BG_STARTING_EVENT_SECOND] = LANG_ARENA_THIRTY_SECONDS;
	m_StartMessageIds[BG_STARTING_EVENT_THIRD] = LANG_ARENA_FIFTEEN_SECONDS;
	m_StartMessageIds[BG_STARTING_EVENT_FOURTH] = LANG_ARENA_HAS_BEGUN;
}

BattlegroundBE::~BattlegroundBE() {
}

void BattlegroundBE::Update(uint32 diff) {
	Battleground::Update(diff);

	if (GetStatus() == STATUS_IN_PROGRESS) {
		if (GetStartTime() >= 47 * MINUTE * IN_MILLISECONDS) // after 47 minutes without one team losing, the arena closes with no winner and no rating change
				{
			UpdateArenaWorldState();
			CheckArenaAfterTimerConditions();
		}
	}
}

void BattlegroundBE::StartingEventCloseDoors() {
	for (uint32 i = BG_BE_OBJECT_DOOR_1; i <= BG_BE_OBJECT_DOOR_4; ++i)
		SpawnBGObject(i, RESPAWN_IMMEDIATELY);

	for (uint32 i = BG_BE_OBJECT_BUFF_1; i <= BG_BE_OBJECT_BUFF_2; ++i)
		SpawnBGObject(i, RESPAWN_ONE_DAY);
}

void BattlegroundBE::StartingEventOpenDoors() {
	for (uint32 i = BG_BE_OBJECT_DOOR_1; i <= BG_BE_OBJECT_DOOR_2; ++i)
		DoorOpen(i);

	for (uint32 i = BG_BE_OBJECT_BUFF_1; i <= BG_BE_OBJECT_BUFF_2; ++i)
		SpawnBGObject(i, 60);
}

void BattlegroundBE::AddPlayer(Player *plr) {
	Battleground::AddPlayer(plr);
	//create score and add it to map, default values are set in constructor
	BattlegroundBEScore* sc = new BattlegroundBEScore;

	m_PlayerScores[plr->GetGUID()] = sc;

	UpdateArenaWorldState();
}

void BattlegroundBE::RemovePlayer(Player* /*plr*/, uint64 /*guid*/) {
	if (GetStatus() == STATUS_WAIT_LEAVE)
		return;

	UpdateArenaWorldState();
	CheckArenaWinConditions();
}

void BattlegroundBE::HandleKillPlayer(Player *player, Player *killer) {
	if (GetStatus() != STATUS_IN_PROGRESS)
		return;

	if (!killer) {
		sLog->outError("Killer player not found");
		return;
	}

	Battleground::HandleKillPlayer(player, killer);

	UpdateArenaWorldState();
	CheckArenaWinConditions();
}

bool BattlegroundBE::HandlePlayerUnderMap(Player *player) {
	player->TeleportTo(GetMapId(), 6238.930176f, 262.963470f, 0.889519f,
			player->GetOrientation(), false);
	return true;
}

void BattlegroundBE::HandleAreaTrigger(Player *Source, uint32 Trigger) {
	// this is wrong way to implement these things. On official it done by gameobject spell cast.
	if (GetStatus() != STATUS_IN_PROGRESS)
		return;

	//uint32 SpellId = 0;
	//uint64 buff_guid = 0;
	switch (Trigger) {
	case 4538: // buff trigger?
		//buff_guid = m_BgObjects[BG_BE_OBJECT_BUFF_1];
		break;
	case 4539: // buff trigger?
		//buff_guid = m_BgObjects[BG_BE_OBJECT_BUFF_2];
		break;
	default:
		sLog->outError("WARNING: Unhandled AreaTrigger in Battleground: %u",
				Trigger);
		Source->GetSession()->SendAreaTriggerMessage(
				"Warning: Unhandled AreaTrigger in Battleground: %u", Trigger);
		break;
	}

	//if (buff_guid)
	//    HandleTriggerBuff(buff_guid, Source);
}

void BattlegroundBE::FillInitialWorldStates(WorldPacket &data) {
	data << uint32(0x9f3) << uint32(1); // 9
	UpdateArenaWorldState();
}

void BattlegroundBE::Reset() {
	//call parent's class reset
	Battleground::Reset();
}

bool BattlegroundBE::SetupBattleground() {
	// gates
	if (!AddObject(BG_BE_OBJECT_DOOR_1, BG_BE_OBJECT_TYPE_DOOR_1, 6287.277f,
			282.1877f, 3.810925f, -2.260201f, 0, 0, 0.9044551f, -0.4265689f,
			RESPAWN_IMMEDIATELY)
			|| !AddObject(BG_BE_OBJECT_DOOR_2, BG_BE_OBJECT_TYPE_DOOR_2,
					6189.546f, 241.7099f, 3.101481f, 0.8813917f, 0, 0,
					0.4265689f, 0.9044551f, RESPAWN_IMMEDIATELY)
			|| !AddObject(BG_BE_OBJECT_DOOR_3, BG_BE_OBJECT_TYPE_DOOR_3,
					6299.116f, 296.5494f, 3.308032f, 0.8813917f, 0, 0,
					0.4265689f, 0.9044551f, RESPAWN_IMMEDIATELY)
			|| !AddObject(BG_BE_OBJECT_DOOR_4, BG_BE_OBJECT_TYPE_DOOR_4,
					6177.708f, 227.3481f, 3.604374f, -2.260201f, 0, 0,
					0.9044551f, -0.4265689f, RESPAWN_IMMEDIATELY)
	// buffs
			|| !AddObject(BG_BE_OBJECT_BUFF_1, BG_BE_OBJECT_TYPE_BUFF_1,
					6249.042f, 275.3239f, 11.22033f, -1.448624f, 0, 0,
					0.6626201f, -0.7489557f, 120)
			|| !AddObject(BG_BE_OBJECT_BUFF_2, BG_BE_OBJECT_TYPE_BUFF_2,
					6228.26f, 249.566f, 11.21812f, -0.06981307f, 0, 0,
					0.03489945f, -0.9993908f, 120)) {
		sLog->outErrorDb("BatteGroundBE: Failed to spawn some object!");
		return false;
	}

	return true;
}

void BattlegroundBE::UpdatePlayerScore(Player* Source, uint32 type,
		uint32 value, bool doAddHonor) {
	BattlegroundScoreMap::iterator itr = m_PlayerScores.find(Source->GetGUID());
	if (itr == m_PlayerScores.end()) // player not found...
		return;

	//there is nothing special in this score
	Battleground::UpdatePlayerScore(Source, type, value, doAddHonor);
}

/*
 21:45:46 id:231310 [S2C] SMSG_INIT_WORLD_STATES (706 = 0x02C2) len: 86
 0000: 32 02 00 00 76 0e 00 00 00 00 00 00 09 00 f3 09  |  2...v...........
 0010: 00 00 01 00 00 00 f1 09 00 00 01 00 00 00 f0 09  |  ................
 0020: 00 00 02 00 00 00 d4 08 00 00 00 00 00 00 d8 08  |  ................
 0030: 00 00 00 00 00 00 d7 08 00 00 00 00 00 00 d6 08  |  ................
 0040: 00 00 00 00 00 00 d5 08 00 00 00 00 00 00 d3 08  |  ................
 0050: 00 00 00 00 00 00                                |  ......

 spell 32724 - Gold Team
 spell 32725 - Green Team
 35774 Gold Team
 35775 Green Team
 */
